有時候當我們雙手放在鍵盤上就想要完成所有 MR 發文的話,這時候就會需要各種好用的快捷鍵!
例如:
網頁沒有提供的話,我們就用 Chrome 提供的 Commands API 來自己寫吧!
background 接到快捷鍵 → 傳給目前分頁的 content script → 執行 MR 文字複製動作。
在 manifest.json 中定義快捷鍵
{
...,
"commands": {
"copy_mr_template": {
"suggested_key": {
"default": "Ctrl+Shift+Y",
"mac": "Command+Shift+Y"
},
"description": "快速複製 MR 通知模板"
}
}
說明:
commands
: 用來定義所有快捷鍵。suggested_key
: 可以指定 Windows 與 macOS 不同的預設組合。description
: 會出現在使用者設定介面中。在 background.js 中接收快捷鍵事件
//background.js
chrome.commands.onCommand.addListener((command) => {
if (command === "copy_mr_template") {
chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
chrome.tabs.sendMessage(tabs[0].id, { action: "copyMRText" });
});
}
});
說明:
chrome.commands.onCommand.addListener
是監聽快捷鍵事件的主要 API。chrome.tabs.sendMessage()
傳送指令給 content script 處理實際邏輯。在 content script 中將共用的複製功能提出,並回應快捷鍵事件
//content_script.js
async function onclick() {
// 取得 MR 資料
const titleEl = document.querySelector(".title")
|| document.querySelector("[data-testid='title-content']")
|| document.querySelector("h1");
const reviewerEl = document.querySelector("[data-testid='reviewer'] div");
const title = titleEl.innerText.trim()
const reviewer = reviewerEl?.innerText.trim() || ''
const clipboardItem = await generateReviewContent(title, reviewer);
return clipboardItem
}
async function addCopyBtn() {
...
// 監聽按鈕點擊事件
btn.addEventListener('click', async () => {
const clipboardItem = await onclick()
// 複製文字到剪貼簿
navigator.clipboard.write([clipboardItem]).then(() => {
showToast("✅ 已成功複製通知文字!");
}).catch(() => {
showToast("❌ 複製失敗,請再試一次");
});
});
...
}
chrome.runtime.onMessage.addListener(async (request, sender, sendResponse) => {
if (request.action === "copyMRText") {
// 要檢查 focus
if (!document.hasFocus()) {
showToast('請先切回該分頁再按快捷鍵');
return;
}
const clipboardItem = await onclick()
// 複製文字到剪貼簿
navigator.clipboard.write([clipboardItem]).then(() => {
showToast("✅ 已成功複製通知文字!");
}).catch((err) => {
console.log(err);
showToast("❌ 複製失敗,請再試一次");
});
}
});
如果沒有 focus 會發生錯誤 Uncaught (in promise) NotAllowedError: Failed to execute 'writeText' on 'Clipboard': Document is not focused.
這是是 Clipboard API 的一個安全限制觸發,意思是:「網頁沒有焦點(not focused),所以瀏覽器拒絕執行 navigator.clipboard.writeText()」。
在 Chrome、Edge、Firefox 等瀏覽器中:
只有「目前使用者實際正在操作的分頁」才有權限寫入剪貼簿。
就會被瀏覽器判定「不是使用者觸發的操作」,從而拒絕。
因此要檢查 focus 並提醒使用者需要在開頁面上才能使用此按鈕
使用者自訂快捷鍵
用戶可以在 Chrome 中輸入以下網址來自訂快捷鍵組合或停用特定快捷鍵:
chrome://extensions/shortcuts
"commands": {
"copy_mr_template": {...},
"open_popup": {...},
"toggle_theme": {...}
}
chrome.action.openPopup()
讓快捷鍵自動開啟 popup。